﻿#pragma once
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QFile>
#include <QDebug>
#include <QHostAddress>
#include <QString>
#include <QMessageBox>
#include <QByteArray>
#include <QTcpSocket>
#include <QMouseEvent>
#include <QPoint>
#include <QTimer>
#include <QSystemTrayIcon>
#include <QListWidget>
#include <QMenu>
#include <QAction>
#include <QInputDialog>
#include <QPainter>
#include <qdrawutil.h>
#include <QSignalMapper>
#include <QMap>
#include <QPair>
#include <QHBoxLayout>
#include <QBitmap>
#include <QWidget>
#include <QDateTime>
#include <QVector>
#include <QListWidgetItem>
#include <QMediaPlayer>
#include "mypdu.h"
#include "mainui.h"
#include "privatechat.h"
#include "mycomboxdelegate.h"
#include "opdb.h"
#include "qgroupchat.h"
using namespace std;

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    virtual ~Widget();
    void loadConfig();
    static Widget& getInstance();
    QTcpSocket& getTcpSocket();
    QTcpSocket& getFileSocket();
    QString getName();
    void mousePressEvent(QMouseEvent *event);//鼠标点击
    void handlerLoginS();//处理登陆成功
    void handlerOnLine();//处理上线
    void handlerOffLine();
    void handlerAddFriend();
    void handlerAddFriend_S();
    void handlerMsgRecv();
    void handlerSecure_Response_S();
    void handlerFileRequest();
    void handlerMove();//处理抖动
    void handlerMediaReuest();
    void handlerAgreeMediaReuest();
    void handlerRefuseMediaReuest();
    void handlerOffLineLog();
    void handlerLoadGroupPerson();
    void handlerGroupMsg(PDU* pdu);
    void mouseMoveEvent(QMouseEvent *event);//鼠标移动
    void mouseReleaseEvent(QMouseEvent *event);//鼠标释放
    void init();//初始化界面上的用户名密码控件,从文件中读取用户名和密码
    void rememberPwd();//登录成功后记住账号和密码
    void deleteaccount(int i);//删除账户
    QPixmap PixmapToRound(const QPixmap &src, const int &radius);//将图片做成圆形
    QList<PrivateChat*>& getPrivateChatList();
    QList<QGroupChat*>& getGroupChatList();
signals:
    void LoadHead(QString uname);

protected:


public slots:
    void readOpt();
    void HandlerLoadHead(QString uname);
private slots:

    void on_btn_reg_clicked();

    void on_btn_login_clicked();

    void on_btn_min_clicked();

    void on_btn_close_clicked();

    void on_btn_find_pwd_clicked();

    void on_comboBox_currentIndexChanged(int index);

private:
    Ui::Widget *ui;
    QString m_ip;   //服务器ip
    qint16 m_port;  //服务器端口号
    QTcpSocket m_sock;//连接服务器的socket
    QTcpSocket m_filesock;//连接服务器传送文件的socket

    QString m_name;//记录登陆用户名
    QTimer m_timer;//用于给登录框上面的颜色渐变
    QTimer m_timer2;//用于自动登录的实现和判断是否勾选记住密码
    QTimer m_timer3;//用于连接服务器传送文件的socket
    int a,b,c,d;//用于控制动态渐变的参数
    bool isPressedWidget;//isPressedWidget和last用来控制窗口移动
    QPoint last;
    QSystemTrayIcon m_trayIcon;//系统托盘
    QMenu m_menu;//为系统托盘添加的右击菜单
    QAction m_ac1,m_ac2;//为菜单添加的菜单项
    QAction m_ac3,m_ac4,m_ac5;//为文本框添加的图标控件
//    QMap<QString,QString> m_map;//用于保存账号密码
//    QMap<int,QPair<QString,QString>> m_map2;//用于记录key(下拉框的index) - value(用户信息)
    bool control_show = false;//控制显示哪个主窗口
    QVector<int> m_vector;//用于控制删除账户
    QStringList m_vecname;//用于辅助填充账号密码
    QStringList m_vecpwd;//用于辅助填充账号密码
    bool control = false;//用于控制文件读取
    QFile m_file;//文件指针
    uint m_filesize;//文件大小
    QString m_filepath;//记录文件路径
    uint m_recvsize;//已接收的大小
    QString m_filename;//文件名
    QList<PrivateChat*> privateChatList;//用于记录私聊窗口
    QList<QGroupChat*> groupChatList;//用于记录群聊窗口
    QSignalMapper* m_mapper;//用于映射登陆框的删除按钮
    QListWidget * m_AccountList = NULL;//下拉列表框
    QMediaPlayer* m_MediaPlayer;//播放提示音
};
#endif // WIDGET_H
